<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>寄生组合式继承</title>
</head>
<body>

<script type="text/javascript">

  // 原型式继承就是类式继承的封装，实现的功能式返回一个实例，该实例的原型继承了传入的o对象
  function inheirObject (o) {
    // 声明一个过渡函数对象
    function F () {}
    // 过渡对象的原型继承父对象
    F.prototype = 0
    // 返回一个过渡对象的实例，该实例的原型继承了父对象
    return new F()
  }

  // 寄生式继承就是对原型对象的第二次封装，使得子类的原型等于父类的原型。并且在第二次封装的过程中对
  // 继承的对象进行了扩展
  function inheirPrototype (subClass, superClass) {
    // 复制一份父类的原型保存在变量中，使得p的原型等于父类的原型
    const p = inheritPrototype(superClass.prototype)
    // 修改因为重写了子类原型导致constructor属性被修改
    p.constructor = subClass
    // 设置子类的原型
    subClass.prototype = p
  }

  // 定义父类
  const SuperClass = function (name) {
    this.name = name
    this.books = ['javascript', 'typescript', 'css']
  }

  // 定义父类原型方法
  SuperClass.prototype.getBooks = function () {
    console.log(this.books)
  }

  // 定义子类
  const subClass = function (name) {
    SuperClass.call(this, name)
  }

  inheirPrototype(SubClass, SuperClass)

  const subClass1 = new SubClass('react')

</script>

</body>
</html>
